package com.state.demo1;

/**
 * 认识状态模式 　　●　　状态和行为
 * 
 * 　　所谓对象的状态，通常指的就是对象实例的属性的值；而行为指的就是对象的功能，再具体点说，行为大多可以对应到方法上。
 * 
 * 　　状态模式的功能就是分离状态的行为，通过维护状态的变化，来调用不同状态对应的不同功能。也就是说，状态和行为是相关联的，它们的关系可以描述为：状态决定行为
 * 。
 * 
 * 　　由于状态是在运行期被改变的，因此行为也会在运行期根据状态的改变而改变。
 * 
 * 　　●　　行为的平行性
 * 
 * 　　注意平行线而不是平等性。所谓平行性指的是各个状态的行为所处的层次是一样的，相互独立的、没有关联的，是根据不同的状态来决定到底走平行线的哪一条。
 * 行为是不同的，当然对应的实现也是不同的，相互之间是不可替换的。
 * 
 * @author Administrator
 *
 */
/**
 * 使用场景
 * 　　考虑一个在线投票系统的应用，要实现控制同一个用户只能投一票，如果一个用户反复投票，而且投票次数超过5次，则判定为恶意刷票，要取消该用户投票的资格
 * ，当然同时也要取消他所投的票；如果一个用户的投票次数超过8次，将进入黑名单，禁止再登录和使用系统。
 * 
 * 　　要使用状态模式实现，首先需要把投票过程的各种状态定义出来，根据以上描述大致分为四种状态：正常投票、反复投票、恶意刷票、进入黑名单。
 * 然后创建一个投票管理对象（相当于Context）。
 * 
 * @author Administrator
 *
 */
public class Test {

	public static void main(String[] args) {

		VoteManager vm = new VoteManager();
		for (int i = 0; i < 9; i++) {
			// 客户端一般只和环境(Context)交互。客户端可以用状态对象来配置一个环境(Context)，一旦配置完毕，就不再需要和状态对象打交道了。客户端通常不负责运行期间状态的维护，也不负责决定后续到底使用哪一个具体的状态处理对象。
			vm.vote("u1", "A");
		}
	}

}
